import java.util.*;

// IUT de Nice / Departement informatique / Module APO Java
// Annee 2012_2013 - Repello
//
// Classe Grille
// 	Classe interte Cellule
//
// Auteur : J.COLIN
//
// V0.0.0

public class Grille {
private Cellule[][] m_grille;
// ------				Constructeur par defaut(6,6)
    public Grille() {

		m_grille = new Cellule[13][13];

    }

// ---                                       equals

	public boolean equals(Object obj){
		if(getHauteur()!=((Grille)obj).getHauteur() || getLargeur()!=((Grille)obj).getLargeur()){return false;}
		for(int i=1; i<getLargeur(); i++){
			for(int j=1; j<getHauteur(); j++){
				if (((Grille)obj).getGrille()[i][j]==null && getGrille()[i][j] != null){return false;}
				if (((Grille)obj).getGrille()[i][j]!=null && getGrille()[i][j] == null){return false;}
				if (((Grille)obj).getGrille()[i][j]!=null && getGrille()[i][j] != null){
					if (getGrille()[i][j].equals(((Grille)obj).getGrille()[i][j]) == false){return false;}
				}
			}
		}
		return true;
	}
// ------				clone()// a faire
/* protected Object clone() {

   		Grille clone = new Cellule[m_grille.getHauteur()][m_grille.getLargeur()];
   		for (int i=0;i<m_grille.getHauteur();i++)
   		{
   			for (int j=0; j<m_grille.getLargeur();j++)
   			{
   			clone[i][j] = m_grille[i][j].clone();
   			}
   		}

   }*/

// ---                  toString

	public String toString(){
		String res = "\n";
		for(int j=0; j<getHauteur()+1; j++){
			for(int i=0; i<getLargeur()*2+2; i++){
				if(i % 2 != 0){res = res+"+";}
				if(i % 2 == 0){res = res+"-";}
			}
			res = res+"\n";
			for(int i=-1; i<getLargeur()*2+1; i++){
				if(i % 2 == 0){res = res+"|";}
				if(i % 2 != 0){
					if(m_grille[(i+1)/2][j] == null){
						res = res+" ";
					}else{res = res+m_grille[(i+1)/2][j].getDeplacement();}
				}
			}
			res = res+"\n";
		}
		for(int i=0; i<getLargeur()*2+2; i++){
				if(i % 2 != 0){res = res+"+";}
				if(i % 2 == 0){res = res+"-";}
			}
		return res;
	}
//--- Accesseurs de consultation
    public int getLargeur(){
    	return m_grille.length-1;
    }
    public int getHauteur(){
    	return m_grille[0].length-1;
    }
    public Cellule[][] getGrille(){
    	return m_grille;
    }


// ------ Methode initialiser
  public void initialiser(){
		int i,j;
		int[] tab = {3,5,1,4,6,2,4,6,2,5,1,3,5};

		for (j=0; j<= this.getHauteur(); j++){
			for (i=0; i<= this.getLargeur(); i++){

				m_grille[i][j]= new Cellule(i,j);
				if (i== 0 && j == 0){m_grille[i][j].m_deplacement = 3;}
				if(i != 0){
					m_grille[i][j].m_deplacement = (m_grille[i-1][j].m_deplacement)+1;
				}
				if(m_grille[i][j].m_deplacement>6){
					m_grille[i][j].m_deplacement = (m_grille[i][j].m_deplacement)-6;
				}
			 	if(i==0){m_grille[i][j].m_deplacement = tab[j] ;}

			}

		}

  }

//------ CLASSE INTERNE : Cellule
	private class Cellule {
	private int m_ligne;
	private int m_colonne;
	private int m_deplacement;
	private boolean m_occupee;
// ------ 				Constru par defaut
		public Cellule() {
			m_ligne = 1;
			m_colonne = 1;
			m_occupee = false;
			m_deplacement = 0;

		}

// ------ 				Constru normal
		public Cellule(int ligne, int colonne) {
			m_ligne = ligne;
			m_colonne = colonne;
			m_occupee = false;
			m_deplacement = 0;
		}
// ------ 				Constru normal
		public Cellule(int ligne) {
			m_ligne = ligne;
			m_colonne = 1;
			m_occupee = false;
			m_deplacement =0;
		}
// ------ 				Constru normal

		public Cellule(int ligne, int colonne,int deplacement) {
			m_ligne = ligne;
			m_colonne = colonne;
			m_occupee = true;
			m_deplacement = deplacement;

		}

// ------				Clone()
	public Object clone(){
			Cellule clone = new Cellule();
			clone.m_ligne = this.m_ligne;
			clone.m_deplacement = this.m_deplacement;
			clone.m_colonne = this.m_colonne;
			clone.m_occupee = this.m_occupee;

			return clone;

		}
// ------				Equals()
		public boolean equals(Object obj){
			if (getDeplacement() != ((Cellule)obj).getDeplacement()){return false;}
			if (getLigne() != ((Cellule)obj).getLigne()){return false;}
			if (getColonne() != ((Cellule)obj).getColonne()){return false;}
			if (getOccup() != ((Cellule)obj).getOccup()){return false;}
			return true;
		}
// ------ 				getLigne()
		public int getLigne(){
			return m_ligne;
		}
// ------ 				getColonne()
		public int getColonne(){
			return m_colonne;
		}
// ------ 				getOccup()
		public boolean getOccup(){
			return m_occupee;
		}
// ------ 				getSymbole()
		public int getDeplacement(){
			return m_deplacement;
		}

    }
}